package br.senacrs;

import javax.swing.JOptionPane;
import util.Random;

import br.senacrs.modelo.Heroi;
import br.senacrs.modelo.Monstro;
import br.senacrs.modelo.Personagem;
import br.senacrs.modelo.Arma;

public class Main {

    public static void main(String[] args) {

        // vetor de personagens
        Personagem[] personagem = new Personagem[2];
        personagem[0] = new Monstro();
        personagem[1] = new Heroi();
        // gravar os personagens
        
        int[] players = new int[] { 0, 1 };
        String inputString;
        for (int i = 0; i < players.length; i++) {
            
            
            inputString = JOptionPane.showInputDialog("Digite o nome do " +personagem[i]+ ": ");
            if (inputString == null) {
                return;
            }
            personagem[i].setNome(inputString);
            Arma minhaArma = new Arma();
            inputString = JOptionPane.showInputDialog("Digite o nome da arma: ");
            if (inputString == null) {
                return;
            }
            minhaArma.setNome(inputString);
            while (true) {
                inputString = JOptionPane.showInputDialog("Digite o dano da arma: ");
                if (inputString == null) {
                    return;
                }
                try {
                    minhaArma.setDano(Integer.parseInt(inputString));
                    break;
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(null, "Digite um numero");
                }
            }
            while (true) {
                inputString = JOptionPane.showInputDialog("Digite o change de acerto da arma: ");
                if (inputString == null) {
                    return;
                }
                try {
                    minhaArma.setAcerto(Integer.parseInt(inputString));
                    break;
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(null, "Digite um numero");
                }
            }
            personagem[i].setArma(minhaArma);
            personagem[i].setVidaMax(Random.randomIntervalo(10, 50));
            personagem[i].setArmadura(Random.randomIntervalo(1, 10));
            personagem[i].setPocao(Random.randomIntervalo(1, 5));
            personagem[i].setVidaAtual(personagem[i].getVidaMax());
            if (personagem[i] instanceof Heroi) {
                Heroi new_name = (Heroi) personagem[i];
                new_name.setMana(Random.randomIntervalo(1, 15));
            } else {
                Monstro new_name = (Monstro) personagem[i];
                new_name.setStamina(Random.randomIntervalo(5, 15));
            }
        }

        int opcao = 0;
        int cont = 1;
        
        while (personagem[0].getVidaAtual() > 0 && personagem[1].getVidaAtual() > 0) {
            String relatorio = ""; 
            for (int j = 0; j < players.length; j++) {
                relatorio += personagem[j].getStatusReport() + "\n\n";
                if (players[j] == 1) {
                    players[j] = 0;
                } else {
                    players[j] = 1;
                }
            }
            
            while(true) {
                inputString = JOptionPane.showInputDialog("Round: " + cont++ +"\n"+ relatorio + personagem[players[0]].getNome() + "!!Sua vez de jogar:\nEscolha uma opcao:\n1-Ataque simples\n2- Tomar Pocao\n3-Ataque especial:" +personagem[players[0]].getNomeAtaqueEspecial());
                if (inputString == null) {
                    return;
                }
                try {
                    opcao = Integer.parseInt(inputString);
                    break;
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(null, "Digite um numero");
                }
            }
            switch (opcao) {
            // ataque
            case 1:
                int changeAcerto = Random.randomIntervalo(1, personagem[players[0]].getArma().getAcerto());
                if (changeAcerto >= personagem[players[1]].getArmadura()) {
                    int danoCausado = Random.randomIntervalo(1, personagem[players[0]].getArma().getDano());
                    personagem[players[1]].setVidaAtual(personagem[players[1]].getVidaAtual() - danoCausado);
                    JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() + " acertou o golpe que causava " + danoCausado + " de dano\n" + personagem[players[1]].getNome() + " tem " + personagem[players[1]].getVidaAtual() + " de vida.");
                } else {
                    JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() + " Errou o golpe");
                }
                break;

            // pocao
            case 2:
                if (personagem[players[0]].getPocao() > 0) {
                    personagem[players[0]].setPocao(personagem[players[0]].getPocao() - 1);
                    int curado = Random.randomIntervalo(5, 15);
                    personagem[players[0]].setVidaAtual(personagem[players[0]].getVidaAtual() + curado);
                    JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() + " tomou uma pocao que recuperava " + curado + " de vida\ne agora tem " + personagem[players[0]].getVidaAtual() + " de vida.");
                } else {
                    JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() +" Voce nao possui pocoes!");
                }
                break;
            //ataque especial
            case 3:
                if (personagem[players[0]] instanceof Heroi) {
                    Heroi new_name = (Heroi) personagem[players[0]];
                    if (new_name.getMana() > 0) {
                        new_name.setMana(new_name.getMana() - 1);
                        int danoCausado = Random.randomIntervalo(1, personagem[players[0]].getArma().getDano());
                        personagem[players[1]].setVidaAtual(personagem[players[1]].getVidaAtual() - danoCausado);
                        JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() + " usou " + personagem[players[0]].getNomeAtaqueEspecial() + " que causou " + danoCausado + " de dano\n" + personagem[players[1]].getNome() + " tem " + personagem[players[1]].getVidaAtual() + " de vida.");
                    } else {
                        JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() +" Voce nao possui mais mana!");
                    }
                } else {
                    Monstro new_name = (Monstro) personagem[players[0]];
                    if (new_name.getStamina() > 0) {
                        new_name.setStamina(new_name.getStamina() - 1);
                        int danoCausado = Random.randomIntervalo(1, personagem[players[0]].getArma().getDano()) + 1;
                        personagem[players[1]].setVidaAtual(personagem[players[1]].getVidaAtual() - danoCausado);
                        JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() + " usou " + personagem[players[0]].getNomeAtaqueEspecial() + " que causou " + danoCausado + " de dano\n" + personagem[players[1]].getNome() + " tem " + personagem[players[1]].getVidaAtual() + " de vida.");
                    } else {
                        JOptionPane.showMessageDialog(null, personagem[players[0]].getNome() +" Voce nao possui mais stamina!");
                    }
                }
                break;
            default:
                JOptionPane.showMessageDialog(null, "Digite apenas 1, 2 ou 3!");
                break;
            }

        }
        // verificar vencedor
        if (personagem[0].getVidaAtual() <= 0) {
            JOptionPane.showMessageDialog(null, personagem[0].getNome() + " morreu!\n" + personagem[1].getNome() + " e o CAMPEAO");
        } else {
            JOptionPane.showMessageDialog(null, personagem[1].getNome() + " morreu!\n" + personagem[0].getNome() + " e o CAMPEAO");
        }
    }
}
